Jeżeli mamy więcej niż jeden projekt i/lub współpracujemy z co najmniej jedną osobą to kontrola nad zależnościami będzie dla nas przydatna.
Anonimowy mieszkaniec Jeżyc
Uwaga! To nie jest sztuka dla sztuki! To jest konieczność jeśli chce się pisać coś więcej niż skrypty na zaliczenie przedmiotu.
Mamy dwa podstawowe problemy, które musimy rozwiązać:
R, jak wiadomo, jest językiem programowania nastawionym na analizę danych. Po to został stworzony prawie 30 lat temu.
„Nie można zrobić konia wyścigowego ze świni. – Nie – odparł Samuel – Ale można z niej zrobić bardzo szybą świnię.“
John Steinbeck, Na wschód od Edenu
Tworzenie oprogramowania w R jest utrudnione, bo narzedzie do tego służące są mniej rozwinięte niż w Pythonie. Wynika to także z tego, że społeczność eRowa jest bardzie skupiona na tym jak wydobyć informację z danych niż jak zbudować dobrze działający (od strony czysto inżynierskiej) system.
Jeszcze kilka lat temu jedyną opcją był packrat.
Posługujący się wynalazkiem strzelec, zapytany o przydatność broni, miał podobno wyrazić, że kulomiot jest jak jego teściowa. Ciężki, brzydki, całkowicie bezużyteczny i nic, tylko wziąć i utopić w rzece.
Andrzej Sapkowski, Sezon burz
Ale od tego czasu sporo się zmieniło i mamy renv. Pozwala on łatwo określić zależności i się nimi dzielić za pomocą systemu kontroli wersji.
Dostajmy plik, który wygląda mniej więcej tak:
{
"R": {
"Version": "4.0.5",
"Repositories": [
{
"Name": "CRAN",
"URL": "https://cran.rstudio.com"
}
]
},
"Packages": {
"renv": {
"Package": "renv",
"Version": "0.13.2",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "079cb1f03ff972b30401ed05623cbe92"
},
"rmarkdown": {
"Package": "rmarkdown",
"Version": "2.11",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "320017b52d05a943981272b295750388"
}
}
}
Kiedy otrzymujemy go od współpracownika (lub siebe z przeszłości) uruchmiany renva i przywracamy środowisko:
W podejściu do zarządzania zależnościami widzimy ogromną różnicę w filozofii stojącej za R i Pythonem.
Explicit is better than implicit.
Python wymaga dokładnego określenia zależności tak, żeby nie zaskakiwały nas podczas uruchomienia programu. R idzie bardziej na żywioł, ale jednocześnie jest mocno wymagający względem osób, które chcą się dzielić kodem.
Mini ciekawostka: Python czasem się wyłamuje z zasady z poematu: strong, implicit types.
W Pythonie mamy kilka opcji, między innymi:
Na potrzeby tych zajęć skupię się na opcji pip+env - jest on prosty, choć niepozbawiony wad.
requirements.txtMamy dwie opcje: albo określimy dokładnie wersje naszych bibliotek, albo może się okazać, że w pewnym momencie aktualizacje spowodują, że nasze środowisko przestanie działać. Więcej info w blog poście.
Określenie wszystkich wersji na stałe i ich całkowite niezmienianie bardzo utrudnia to, aby software którego używamy był rozsądnie aktualny - jedna z dobrych zasad tworzenia oprogramowania.
Każdy ma prawo używać czego chce, ale przedstawię kod dla opcji, która dla mnie osobiście jest najwygodniejsza.
.venvTeraz komenda python będzie odwoływać się do pythona z naszego wirtualnego środowiska.
pandas
numpy
sqlalchemy
Uwaga: w systemie kontroli wersji potrzebujemy zarówno pliku requirements.in jak i requirements.txt
install.packages() -> instalacje najnowszych wersji z CRAN.